import { Event } from '../../utils';

import type { IShellLaunchConfig } from './pty';

// 终端错误类型枚举
export enum ETerminalErrorType {
  CREATE_FAIL = 0, // 创建失败
}

// 终端错误信息接口
export interface ITerminalError {
  /**
   * 终端客户端的唯一标别
   */
  id: string;
  /**
   * 是否已经中断
   */
  stopped: boolean;
  /**
   * 错误类型
   */
  type?: ETerminalErrorType;
  /**
   * 是否需要继续重连，默认为 true
   */
  shouldReconnect?: boolean;
  /**
   * 报错信息
   */
  message: string;
  /**
   * @deprecated 是否可以重连
   *
   * 这个字段语义不太正确，而且框架层并没有用到，后面尽量不要使用
   */
  reconnected?: boolean;
  /**
   * 启动配置
   */
  launchConfig?: IShellLaunchConfig;
}

// 判断对象是否为终端错误类型
export function isTerminalError(data: any): data is ITerminalError {
  return data.message !== undefined;
}

// 终端错误服务接口
export interface ITerminalErrorService {
  errors: Map<string, ITerminalError>; // 所有终端错误信息
  onErrorsChange: Event<void>; // 错误变更事件
  fix(clientId: string): Promise<void>; // 修复指定终端错误
}
